package top.chmin.project.cloud.common.menu.auto;

import org.springframework.stereotype.Repository;
import top.chmin.project.cloud.common.dao.BaseDao;
import top.chmin.project.cloud.common.entity.Condition;
import top.chmin.project.cloud.common.entity.Page;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

/**
 * chmin
 * 2023-12-25 09:15:43
 * cloud-builder
 */
@Repository
public class MenuDao extends BaseDao<Menu> {

    @Override
    public int save(Menu model) {
        StringBuilder sb = new StringBuilder("INSERT INTO menu(");
// field column auto
// #bind.field.MenuKey#
        sb.append("menu_key,");
// $bind.field.MenuKey$

// #bind.field.MenuPath#
        sb.append("menu_path,");
// $bind.field.MenuPath$

// #bind.field.MenuLabel#
        sb.append("menu_label,");
// $bind.field.MenuLabel$

// #bind.field.ParentMenu#
        sb.append("parent_menu,");
// $bind.field.ParentMenu$

        sb.append("create_by,update_by,create_time,update_time");
        sb.append(") VALUES (");
// field ? auto
// #bind.field.MenuKey#
        sb.append("?,"); // menu_key
// $bind.field.MenuKey$

// #bind.field.MenuPath#
        sb.append("?,"); // menu_path
// $bind.field.MenuPath$

// #bind.field.MenuLabel#
        sb.append("?,"); // menu_label
// $bind.field.MenuLabel$

// #bind.field.ParentMenu#
        sb.append("?,"); // parent_menu
// $bind.field.ParentMenu$

        sb.append("?,?,?,?");
        sb.append(")");

        return template.update(sb.toString(),
// field value auto
// #bind.field.MenuKey#
                model.getMenuKey(),
// $bind.field.MenuKey$

// #bind.field.MenuPath#
                model.getMenuPath(),
// $bind.field.MenuPath$

// #bind.field.MenuLabel#
                model.getMenuLabel(),
// $bind.field.MenuLabel$

// #bind.field.ParentMenu#
                model.getParentMenu(),
// $bind.field.ParentMenu$

                model.getCreateBy(),
                model.getUpdateBy(),
                model.getCreateTime(),
                model.getUpdateTime()
        );
    }

    @Override
    public int save(List<Menu> list) {
        StringBuilder sb = new StringBuilder("INSERT INTO menu(");
// field column auto
// #bind.field.MenuKey#
        sb.append("menu_key,");
// $bind.field.MenuKey$

// #bind.field.MenuPath#
        sb.append("menu_path,");
// $bind.field.MenuPath$

// #bind.field.MenuLabel#
        sb.append("menu_label,");
// $bind.field.MenuLabel$

// #bind.field.ParentMenu#
        sb.append("parent_menu,");
// $bind.field.ParentMenu$

        sb.append("create_by,update_by,create_time,update_time");
        sb.append(") VALUES (");
// field ? auto
// #bind.field.MenuKey#
        sb.append("?,"); // menu_key
// $bind.field.MenuKey$

// #bind.field.MenuPath#
        sb.append("?,"); // menu_path
// $bind.field.MenuPath$

// #bind.field.MenuLabel#
        sb.append("?,"); // menu_label
// $bind.field.MenuLabel$

// #bind.field.ParentMenu#
        sb.append("?,"); // parent_menu
// $bind.field.ParentMenu$

        sb.append("?,?,?,?");
        sb.append(")");
        return Arrays.stream(template.batchUpdate(sb.toString(),
                list.stream()
                        .map(model -> new Object[]{
// field value auto
// #bind.field.MenuKey#
                                model.getMenuKey(),
// $bind.field.MenuKey$

// #bind.field.MenuPath#
                                model.getMenuPath(),
// $bind.field.MenuPath$

// #bind.field.MenuLabel#
                                model.getMenuLabel(),
// $bind.field.MenuLabel$

// #bind.field.ParentMenu#
                                model.getParentMenu(),
// $bind.field.ParentMenu$

                                model.getCreateBy(),
                                model.getUpdateBy(),
                                model.getCreateTime(),
                                model.getUpdateTime()
                        })
                        .toList()
        )).sum();
    }

    @Override
    public int updateById(Menu model) {
        return updateByCondition(model.getPreCondition().forUpdate().id().eq().toCondition());
    }

    @Override
    public int deleteById(Long id) {
        return deleteByCondition(new MenuFPC().forDelete().id().eq(id).toCondition());
    }

    @Override
    public int deleteById(List<Long> list) {
        return deleteByCondition(new MenuFPC().forDelete().id().in(list).toCondition());
    }

    @Override
    public Menu getById(Long id) {
        return getStreamByCondition(new MenuFPC().id().eq(id).toCondition(), Menu.class).findFirst().orElse(null);
    }

    @Override
    public List<Menu> getListById(List<Long> list) {
        return getStreamByCondition(new MenuFPC().id().in(list).toCondition(), Menu.class).toList();
    }

    @Override
    public Menu getFirst(Condition condition) {
        return getFirst(condition, Menu.class);
    }

    @Override
    public Stream<Menu> getStreamByCondition(Condition condition) {
        return getStreamByCondition(condition, Menu.class);
    }

    @Override
    public Page<Menu> getPageByCondition(Condition condition) {
        return getPageByCondition(condition, Menu.class);
    }
}
